(function($) {
	$.fn.tree.parser.options.list = "body.list || body || rows";
	$.fn.datagrid.parser.options.list = "body.list || body || rows";
	$.fn.datagrid.parser.options.total = "body.total || extra.total";
	$.fn.combo.defaults.valueField = "key";
	$.fn.combo.defaults.textField = "value";
	$.fn.tree.defaults.idField = "key";
	$.fn.tree.defaults.treeField = "value";
	$.fn.tree.defaults.parentField = "parent";
	$.fn.treegrid.defaults.idField = "key";
	$.fn.treegrid.defaults.treeField = "value";
	$.fn.treegrid.defaults.parentField = "parent";
	$.fn.combotree.defaults.idField = "key";
	$.fn.combotree.defaults.treeField = "value";
	$.fn.combotree.defaults.parentField = "parent";

	$.fn.window.defaults.maxHeight = "85%";
	$.fn.combobox.defaults.notFoundText = "(已删除)";
	$.fn.combotree.defaults.notFoundText = "(已删除)";
	
	$.fn.filebox.defaults.editable = false;
	$.fn.filebox.defaults.readonly = false;

	$.fn.combo.defaults.panelHeight = "auto";
	$.fn.combo.defaults.panelMinHeight = 20;
	$.fn.combo.defaults.panelMaxHeight = 200;
	$.fn.combobox.defaults.panelHeight = "auto";
	$.fn.combobox.defaults.panelMinHeight = 20;
	$.fn.combobox.defaults.panelMaxHeight = 200;
	$.fn.combotree.defaults.panelHeight = "auto";
	$.fn.combotree.defaults.panelMinHeight = 20;
	$.fn.combotree.defaults.panelMaxHeight = 200;
	$.fn.combogrid.defaults.panelHeight = "auto";
	$.fn.combogrid.defaults.panelMinHeight = 20;
	$.fn.combogrid.defaults.panelMaxHeight = 200;

	$.fn.datagrid.defaults.getFieldValue = function(json, fieldName) {
		return fieldName.indexOf('.') > 0 ? $.zhh.field(json, fieldName) : json[fieldName];
	};
	$.extend($.fn.datagrid.defaults, { fit:true,border:false,rownumbers:true,pagination:true, singleSelect:true,checkOnSelect:false,selectOnCheck:false,pageSize:20,pageList:[10,20,50,200,500,1000] });
	$.extend($.fn.treegrid.defaults, { fit:true,border:false,rownumbers:true,pagination:false,singleSelect:true,checkOnSelect:false,selectOnCheck:false });

	// 多选按钮需要勾选第1列才能操作, 这个区别不太明显, 因此想加一个标志与其他按钮区分一下
	// 方案1: multi-use-checkbox-icon, 多选按钮的图标统一换成checkbox
	// 方案2: multi-use-red-icon, 多选按钮的图标颜色统一换成红色
	// 方案3: multi-use-check-flag, 多选按钮的文字后面加check标记
	$.fn.datagrid.defaults.multiCheckCls = 'multi-use-check-flag';
	$.fn.treegrid.defaults.multiCheckCls = 'multi-use-check-flag';

	// 火狐浏览器BUG
	// Edge依然有问题, combobox filter, 输入汉字搜索时, 搜索的关键字不是本次输入的内容而是上一次的内容
	$.fn.combobox.defaults.inputEvents.keyup = $.fn.combobox.defaults.inputEvents.keydown;
	$.fn.combobox.defaults.inputEvents.keydown = function() {};
})(jQuery);


(function($) {

	// 设置tree的默认数据解析器
	$.fn.tree.defaults.loadFilter = $.fn.tree.parser;
	$.fn.combotree.defaults.loadFilter = $.fn.tree.parser;
	$.fn.treegrid.defaults.loadFilter = $.fn.tree.parser;
	// 设置datagrid的默认数据解析器
	$.fn.datagrid.defaults.loadFilter = $.fn.datagrid.parser;

	// 加载页面内容的过滤器
	$.fn.xui.defaults.pageContentFilter = /<section[^>]*>((.|[\r\n])*)<\/section>/im;

	var REGEXP = /^\{\s*"code"\s*:\s*"UNAUTHORIZED".*\}$/;
	$.fn.xui.defaults.checkAuthorized = function(data) {
		if (REGEXP.test(data)) { // 未登录
			var pnl = $(this);
			setTimeout(function() {
				// 关闭进度条
				pnl.panel("xprogress", "close");
				// 弹出登录框
				$(".x-dialog.login").xcall("open")
					// 记录下当前窗口, 用于登录后刷新
					.xcall("options")["login-refresh-panel"] = pnl;
			}, 100);
			return false;
		}
	};

	$.fn.xui.defaults.isJsonSuccess = function(json) {
		if (typeof(json) == "string") {
			try {
				json = $.parseJSON(json);
			} catch (e) {
				return false;
			}
		}
		if (json.code && json.code != "SUCCESS") {
			$.log.warn("JSON result code is " + json.code + ".");
			return false;
		}
	};
	$.extend($.fn.xui.defaults.onPopupButton.submit, {
		dataFilter: function(e) {
			if (typeof(e.data) == "string" && e.data.startsWith("{") && e.data.endsWith("}")) {
				return $.parseJSON(e.data);
			} else {
				return e.data || {};
			}
		},
		onMessage: function(e) { // 提交通知
			if (e.success) {
				$.messager.hint(e.message + (e.suffix?"成功":""));
			} else {
				if (e.data && e.data.code == "UNAUTHORIZED") { // 未登录时弹出登录框
					$(".x-dialog.login").xcall("open");
					return false;
				} else { // 错误提示
					$(this).warnning((e.data && e.data.message) || (e.message + (e.suffix?"失败":"")));
				}
			}
		}
	});
	
	// excel导入
	$.fn.xui.defaults.onPopupButton["import"] = $.extend(true, {}, $.fn.xui.defaults.onPopupButton.submit, {
		onBefore: function(e) {
			e.form.find(".state-icon").addClass("icon-loading");
		}, onError: function(e) {
			e.form.find(".state-icon").removeClass("icon-loading");
		}, onSuccess: function(e) {
			e.form.find(".state-icon").removeClass("icon-loading");
			
			var total = e.data.body.total;
			var failed = e.data.body.failed;
			if (total == 0) {
				return "未找到任何可导入的信息";
			} else if (failed.length == 0) { // 全部成功
				return '共导入成功 <span class="records">' + total + '</span> 条记录';
			} else { // 有失败列表
				var dlg = e.space.xpopups("import-failed", "open");
				dlg.find(".records.success").text(total - failed.length);
				dlg.find(".records.failed").text(failed.length);
				dlg.find(".x-datagrid").xcall("loadData", failed);
				return false;
			}
		}
	});
	// excel导出
	// popup的linkbutton的onClick触发查询
	// x-linkbutton data-href="actions/area-division/export.do?filename=xxx.xlsx" data-options="onClick:xfn.popup.export,..."
	$.fn.xui.defaults.xfn.popup["export"] = function() {
		var dlg = $(this).closest(".dialog-button").prev("div.x-dialog");
		var loading = dlg.find(".state-icon").addClass("icon-loading");
		var datalist = dlg.xcall("options").xref.datalist;
		var opts = datalist.xcall("options");

		var params = { paging:false, needCount:false, extra:false };
		var initial = opts.xref.space.xcall("options").initial;
		// fixedParams是每次请求都会追加的参数
		// 与queryParams的区别是, dg.datagrid("load",{}), queryParams会被清除, fixedParams清除不掉
		$.extend(params, initial.fixedParams, opts.fixedParams);
		var form = datalist.xcall("getPanel").find(".datagrid-toolbar form");
		if (form.length) { $.extend(params, form.serializeJson()); }

		$.fn.xui.defaults.callEvent.call(datalist.get(0), "onBeforeLoad", [params]);

		var url = $(this).attr("data-href");
		var c = (url.indexOf("?") < 0) ? "?" : "&";
		window.open(url + c + $.param(params));

		setTimeout(function() {
			loading.removeClass("icon-loading");
			dlg.dialog("close");
		}, 2 * 1000);
	};

})(jQuery);


/**
 * -------------------------------------------------------------
 * 文件上传, 可直接上传至阿里百川服务器
 * 如果不支持h5, 则通过后台服务器中转
 * -------------------------------------------------------------
 * @author 赵卉华
 * date: 2016-05-11
 * -------------------------------------------------------------
 */
(function($) {
	var KEY = "__file_upload__";
	var LAST = "__last_upload__";
	var upload = function(form, config) {
		form.queue(KEY, function() {
			Wantu.upload({
				file:config.file[0].files[0], 
				token:config.token, sizeLimit:config.sizeLimit,
				callback: function(percent, result) {
					config.percent = percent;
					config.result = result;
					// 汇报进度
					config.process.call(config.self, config);
					if (percent == 100) { // 上传完成
						// 将文件URL填充到input中
						if (config.input.is("[textboxname]")) {
							config.input.xcall("setValue", result.url);
						} else {
							config.input.val(result.url);
						}
						// 禁用文件控件, 以阻止文件内容提交
						config.file.addClass("temp-disabled").attr("disabled", "disabled");
						// 记下上传成功的文件名
						config.file.data(LAST, config.file.val());
						// 继续上传
						form.dequeue(KEY);
					}
				}
			});
		});
	};
	var process = function(e) {
		// TODO console.log(e.index + " --> " + e.percent + "    " + JSON.stringify(e.result));
	};
	$.fn.xui.defaults.onPopupButton.upload = $.extend(true, {}, $.fn.xui.defaults.onPopupButton.submit, {
		onReady: function(e, doSubmit) {
			var self = this;
			$(this).linkbutton("disable");
			var fileboxes = e.form.find(".x-filebox").filterOptions("uploaded");
			// 没有文件, 或者 不支持FormData(h5特性), 或者 不支持玩兔, 直接提交
			if (fileboxes.length == 0 || !window.FormData || !window.Wantu) {
				doSubmit.call(this, e);
				return;
			}
			// 检查浏览器是否支持h5直接读取文件, 以及有没有需要上传的文件
			var length = 0;
			e.form.find("input[type=file]").each(function() {
				if (this.files && this.files.length) { length ++; }
			});
			// 不支持h5特性, 或者 没有需要上传的文件, 直接提交
			if (length == 0) {
				doSubmit.call(this, e);
				return;
			}
			// 通过服务器获取授权信息
			var url = $("meta[name=file-authorize]").attr("content");
			$.post(url, function(json) {
				// 上传文件
				fileboxes.each(function(i) {
					var me = $(this);
					var file = me.next(".filebox").find("input[type=file]");
					// 未选中文件
					if (file.length == 0 || file[0].files.length == 0) { return true; }
					// 之前上传成功过(可能表单提交失败了)
					if (file.data(LAST) == file.val()) { return true; }
					var input = e.form.find(me.xcall("options").uploaded);
					var config = { file:file, input:input, index:i, self:this, process:process };
					upload(e.form, $.extend({}, json.body, config));
				});
				// 提交表单
				e.form.queue(KEY, function() {
					doSubmit.call(self, e);
				});
				// 开始执行
				e.form.dequeue(KEY);
			});
		}, 
		onFinish: function(e, doFinish) {
			// 启用文件控件
			e.form.find("input[type=file].temp-disabled").removeClass("temp-disabled").removeAttr("disabled");
			doFinish.call(this, e);
		}
	});
})(jQuery);




/**
 * 成功提示
 * $.messager.hint("操作成功");
 */
(function($) {
	var def = {
		timeout:3000, height:50,
		showType:null, // fade 显示出来有点慢
		style: { "text-align":"center", right:"", top:0 } // 居中(bottom:"")
	};
	$.messager.hint = function(options) {
		if (typeof(options) == "string") { options = { msg:options }; }
		$.messager.show($.extend(true, {}, def, options, { title:"" }));
	};
})(jQuery);


/**
 * 警告提示框
 * $(xxx).warnning(msg);
 * $(xxx).warnning(msg, position);
 * msg 消息内容
 * position 位置:left|right|top|bottom
 */
(function($) {
	var INIT = "WARNNING-INIT";
	var OPTIONS = {
		position : "bottom",
		showEvent : false,
		hideDelay : 500,
		onShow : function() {
			$(this).tooltip("tip").addClass("warnning");
		}
	};
	$.fn.warnning = function(msg, position) {
		return this.each(function() {
			var me = $(this);
			if (!me.data(INIT)) {
				var o = $.extend({}, OPTIONS, me.zoptions("warnning"), { position:position });
				me.data(INIT, true).tooltip(o);
			}
			me.tooltip("update", msg).tooltip("show");
			me.data("tooltip").tip.hover(function() { $(this).hide(); });
		});
	};
})(jQuery);
